import { h } from 'vue'
import { MarkerType } from '@vue-flow/core'
/**
 * 解析data.json数据，生成nodes和edges数组
 * @returns {Object} 包含nodes和edges的对象
 */
export function parseTraceData (dataJson) {
  const nodes = []
  const edges = []
  let nodeCounter = 0

  // 递归处理节点
  function processNode (node, parentId = null, level = 0) {
    // 创建节点
    const nodeData = {
      id: node.nodeId,
      type: level === 0 ? 'input' : (!node.children || node.children.length === 0) ? 'output' : 'default',
      position: {
        x: 100 + level * 300,
        y: 100 + nodeCounter * 200
      },
      data: {
        label: h('div', [
          h('span', { style: { fontSize: '10px' } }, new Date(node.createTime).toLocaleString()),
          h('br'),
          h('span', { style: { fontWeight: 'bold' } }, `${node.className.split('.').pop()}.${node.methodName}`)
        ]),
        title: `${node.methodPath}`,
        fullLabel: `${node.methodPath}耗时: ${node.costTime}ms状态: ${node.status}`,
        exceptionStack: node.exceptionStack,
        costTime: node.costTime,
        status: node.status,
        warnThreshold: node.warnThreshold,
        requestParam: node.requestParam,
        responseParam: node.responseParam
      },
      style: {
        background: getNodeColor(node.status, node.costTime, node.warnThreshold),
        color: '#fff',
        border: `2px solid ${getNodeColor(node.status, node.costTime, node.warnThreshold)}`,
        borderRadius: '8px',
        padding: '10px',
        minWidth: '200px',
        fontSize: '12px'
      }
    }

    nodes.push(nodeData)
    nodeCounter++

    // 如果有父节点，创建边
    if (parentId) {
      // 根据子节点状态设置边的样式
      const isFailStatus = node.status === 'FAIL'
      const edgeData = {
        id: `e${parentId}-${node.nodeId}`,
        source: parentId,
        type: 'straight',
        target: node.nodeId,
        animated: isFailStatus, // FAIL状态时动画为true，其他为false
        style: {
          stroke: isFailStatus ? '#ef4444' : '#10b981', // FAIL状态时红色，其他绿色
          strokeWidth: 2
        },
        label: `${node.costTime}ms`,
        markerEnd: MarkerType.ArrowClosed
      }
      edges.push(edgeData)
    }

    // 递归处理子节点
    if (node.children && node.children.length > 0) {
      node.children.forEach(child => {
        processNode(child, node.nodeId, level + 1)
      })
    }
  }

  // 开始处理根节点
  processNode(dataJson)

  return { nodes, edges }
}

/**
 * 根据状态、耗时和阈值获取节点颜色
 * @param {string} status - 节点状态
 * @param {number} costTime - 耗时
 * @param {number} warnThreshold - 警告阈值
 * @returns {string} 颜色值
 */
function getNodeColor (status, costTime, warnThreshold) {
  if (status === 'FAIL') {
    return '#ef4444' // 红色 - 失败状态
  }

  if (costTime > warnThreshold || status !== 'SUCCESS') {
    return '#f59e0b' // 橙色 - 超时警告
  }

  // 根据耗时范围分配不同颜色
  if (costTime < 100) {
    return '#10b981' // 绿色 - 快速
  } else if (costTime < 300) {
    return '#8b5cf6' // 紫色 - 中等
  } else {
    return '#06b6d4' // 青色 - 较慢
  }
}